fn main() {
    /*
    if判断
    1. 是或非判断，主要侧重过程判断，正在确认的过程，例如：a < 10，
    */
    // 常规用法
    let score = 23;
    if score < 60 {
        println!("fail");
    } else if score < 80 {
        println!("pass");
    } else {
        println!("good");
    }

    // 表达式用法
    let msg = if score < 60 { "fail" } else { "pass" };
    println!("msg: {msg}");

    /*
      match匹配模式
      1. 匹配判断，主要侧重结果判断，结果无限可能，可以是int，可以是string，等等，则需要穷尽；例如：1 = a, '1' = a...
      2. 同时也兼顾过程，对过程的预判，例如：1 | 2，1..=5
      3. 对于枚举这种类型，就完美踩中匹配的思想，一个需要穷尽，一个必须穷尽
    */
    // 匹配枚举
    let num = 10;
    match num {
        1 => println!("one"),
        2 => println!("two"),
        3 => println!("three"),
        // 可以在匹配后接逻辑，直接在后面打括号里写，也不用逗号结尾；other，是匹配剩余，并且接受值，下划线则不会接受值
        other => {
            println!("others: {}", other)
        }
    }

    // 匹配守卫
    let num = 10;
    match num {
        1 | 2 => println!("one or two"),
        3 => println!("three"),
        _ => println!("others"),
    }

    // 匹配范围
    let num = 10;
    match num {
        1..=5 => println!("one to five"),
        6..=10 => println!("six to ten"),
        _ => println!("others"),
    }

    // 匹配if
    let num = 10;
    match num {
        x if x > 5 => println!("gt 5"),
        x if x < 5 => println!("lt 5"),
        _ => println!("eq 5"),
    }

    let msg = match num {
        x if x > 5 => "gt 5".to_owned(),
        x if x < 5 => "lt 5".to_owned(),
        _ => "eq 5".to_owned(),
    };
    println!("msg: {msg}");

    // 经验
    let value = Some(1);
    match value {
        // 在匹配Option枚举时，第一个匹配None性能上更优
        None => println!("None"),
        Some(other) => println!("{}", other),
    }

    /*
     if let语法
     1. 是match匹配模式的一种简化，让代码可以更简洁，侧重在某个结果上
     2. 配合着带有变量的枚举，可以进一步对变量进行声明提取
    */
    let value = Some('x');
    // 匹配Some类型值为1的值
    if let Some('1') = value {
        println!("Some {}", value.unwrap())
    }

    // 匹配Some类型
    if let Some(i) = value {
        println!("Some {}", i)
    } else {
        println!("Noen")
    }

    /*
    while let语法
    1. 匹配模式加无限循环增强，简化了一种无限循环的匹配模式语法
     */
    let mut value = Some(0);
    while let Some(i) = value {
        if i > 9 {
            println!("gt 9, quit!");
            value = None
        } else {
            println!("i is {}, lt 9, again.", i);
            value = Some(i + 1)
        }
    }
}
